import type { AxiosInstance, AxiosResponse } from "axios";

import type { RequestInterceptorConfig, ResponseInterceptorConfig } from "../types";

const defaultRequestInterceptorConfig: RequestInterceptorConfig = {
	fulfilled: (response) => response,
	rejected: (error) => Promise.reject(error),
};

const defaultResponseInterceptorConfig: ResponseInterceptorConfig = {
	fulfilled: (response: AxiosResponse) => response,
	rejected: (error) => Promise.reject(error),
};

class InterceptorManager {
	private axiosInstance: AxiosInstance;

	constructor(instance: AxiosInstance) {
		this.axiosInstance = instance;
	}

	addRequestInterceptor({ fulfilled, rejected }: RequestInterceptorConfig = defaultRequestInterceptorConfig) {
		this.axiosInstance.interceptors.request.use(fulfilled, rejected);
	}

	addResponseInterceptor<T = any>({
		fulfilled,
		rejected,
	}: ResponseInterceptorConfig<T> = defaultResponseInterceptorConfig) {
		this.axiosInstance.interceptors.response.use(fulfilled, rejected);
	}
}

export { InterceptorManager };
